約 2,759,052 件
https://w.atwiki.jp/akasatanahama/pages/137.html
概要 Minecraft内のクラス書き換えインターフェイス、"IClassTransformer"を用いてバニラクラスの書き換えを行う。 このチュートリアルはとても難解な内容を含んでいます。 中級編までをひとしきり出来るようになってから挑戦してください。 バニラクラスを書き換えるため競合に注意して行ってください。 事前準備 今回は事前の準備が幾つか必要である。 まず、クラス書き換え用の別ディレクトリをsrc/main/java内に作成する。今回はalcore.asmとする。 ディレクトリを分けずにやると正しく読み込めなくなるため必ずディレクトリを分ける。 次に、coremodとして働かせる(→クラス書き換え用に通常のMODより早く読み込む)MODとして、開発環境とビルド環境にそれぞれ読み込ませる。 今回はcoremodのクラスをalcore.asm.ALCorePluginとする。 ビルド環境 MODのjarファイル内に情報を埋め込めるよう、build.gradleファイルの末尾に以下のコードを追加する。 //manifestファイルの書き込みをビルドに追加する。これにより、coremodの読み込みが可能になる。 //なお、テスト起動時にはこのオプションが効かないためVMオプションに以下の引数を追加する。 //-Dfml.coreMods.load=alcore.asm.ALCorePlugin jar { manifest { //coremodのパスを指定する。 attributes FMLCorePlugin alcore.asm.ALCorePlugin //今回はAluminiummodが別で入っているためそれも読み込む。 attributes FMLCorePluginContainsFMLMod true } } 開発環境 開発環境では上記のものが効かないためVMオプションに以下の引数を追加する。 -Dfml.coreMods.load=alcore.asm.ALCorePlugin ソースコード 今回は、ディレクトリ"tutorial.aluminiummod"でアイテムの追加とレシピの追加及び鉱石の追加を参考にアルミニウムインゴット、アルミニウム鉱石とその精錬レシピまでを実装してある前提で解説する。 もしそこまでのやり方がわからない場合は、一旦上記三つのチュートリアルをよく読んでから戻ってきていただきたい。 ALCorePlugin.java package alcore.asm; import cpw.mods.fml.relauncher.IFMLLoadingPlugin; import java.util.Map; public class ALCorePlugin implements IFMLLoadingPlugin { //書き換え機能を実装したクラス一覧を渡す関数。書き方はパッケージ名+クラス名。 @Override public String[] getASMTransformerClass() { return new String[]{"alcore.asm.ALCoreTransformer"}; } //あとは今回は使わない為適当に。 @Override public String getSetupClass() { return null; } @Override public void injectData(Map String, Object data) { } @Override public String getAccessTransformerClass() { return null; } @Override public String getModContainerClass() { return null; } } ALCoreTransformer.java package alcore.asm; import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; import net.minecraft.launchwrapper.IClassTransformer; import org.objectweb.asm.*; import static org.objectweb.asm.Opcodes.*; public class ALCoreTransformer implements IClassTransformer { //IClassTransformerにより呼ばれる書き換え用のメソッド。 @Override public byte[] transform(final String name, final String transformedName, byte[] bytes) { //対象クラス以外を除外する。対象は呼び出し元があるクラスである。 if (!"net.minecraft.tileentity.TileEntityFurnace".equals(transformedName)) return bytes; ClassReader cr = new ClassReader(bytes); ClassWriter cw = new ClassWriter(1); ClassVisitor cv = new ClassVisitor(ASM4, cw) { //クラス内のメソッドを訪れる。 @Override public MethodVisitor visitMethod(int access, String methodName, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, methodName, desc, signature, exceptions); //呼び出し元のメソッドを参照していることを確認する。 String s1 = FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(name, methodName, desc); //C \Users\ ユーザー名 \.gradle\caches\minecraft\net\minecraftforge\forge\1.7.10-10.13.4.1558-1.7.10\forge-1.7.10-10.13.4.1558-1.7.10-decomp.jar\より名称を検索、比較してメソッドの難読化名を探す。 if (s1.equals("updateEntity") || s1.equals("func_145845_h") || methodName.equals("updateEntity") || methodName.equals("func_145845_h")) { //もし対象だったらMethodVisitorを差し替える。 mv = new MethodVisitor(ASM4, mv) { //呼び出す予定のメソッドを読み込む。 @Override public void visitMethodInsn(int opcode, String owner, String methodName, String desc, boolean itf) { //書き換え対象のメソッドであることを確認する。 String s2 = FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(name, methodName, desc); if (s2.equals("isBurning") || s2.equals("func_145950_i") || methodName.equals("isBurning") || methodName.equals("func_145950_i")) { //引数として次に渡す値にthisを指定する。 mv.visitVarInsn(ALOAD, 0); //メソッドを読み込む。INVOKESTATICでstaticメソッドを呼び出す。 super.visitMethodInsn(INVOKESTATIC, "alcore/asm/ALCoreHook", "ALFurnaceHook", Type.getMethodDescriptor(Type.VOID_TYPE, Type.getObjectType("net/minecraft/tileentity/TileEntity")), false); //今回はフックを差し込むだけだが、ここで書き換えも出来る。 } //今回は最後に元のクラスを読み込んでreturnする。 super.visitMethodInsn(opcode, owner, methodName, desc, itf); } }; } return mv; } }; cr.accept(cv, ClassReader.EXPAND_FRAMES); return cw.toByteArray(); } } ALCoreHook.java package alcore.asm; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityFurnace; import tutorial.aluminiummod.AluminiumMod; public class ALCoreHook { //差し込むフック。フック内の詳細は割愛。簡単に言うと、鉄鉱石とアルミニウムインゴットがある状態で火がついていたら爆発して鉄を撒き散らす。 public static void ALFurnaceHook(TileEntity tileEntity) { if (tileEntity instanceof TileEntityFurnace) { TileEntityFurnace furnace = ((TileEntityFurnace) tileEntity); if (furnace.furnaceBurnTime 0 furnace.getStackInSlot(0) != null furnace.getStackInSlot(0).getItem() == Item.getItemFromBlock(Blocks.iron_ore) furnace.getStackInSlot(2) != null furnace.getStackInSlot(2).getItem() == AluminiumMod.aluminium) { furnace.setInventorySlotContents(0, null); furnace.setInventorySlotContents(1, null); furnace.setInventorySlotContents(2, null); if (!furnace.getWorldObj().isRemote) { furnace.getWorldObj().newExplosion(null, furnace.xCoord, furnace.yCoord, furnace.zCoord, 15, true, true); EntityItem entityItem = new EntityItem(furnace.getWorldObj(), furnace.xCoord, furnace.yCoord, furnace.zCoord, new ItemStack(Items.iron_ingot, furnace.getWorldObj().rand.nextInt(32) + 32)); entityItem.fireResistance = Integer.MAX_VALUE; furnace.getWorldObj().spawnEntityInWorld(entityItem); } } } } } 解説 ALCorePlugin.java public String[] getASMTransformerClass() 書き換えするコードを記述したIClassTransformerを実装してあるクラスを渡す。 配列形式であるため、トランスフォーマーはいくつも追加することが出来る。 public String getModContainerClass() 今回はModとして見えないように実装するため、nullを返してある。 もしModとして見えるようにする(CodeChickenCoreのように別MODとしてリリースする)ならば、DummyModContainerを継承したクラス名をStringで渡す。 ex. "alcore.asm.ALModContainer" ALCoreTransformer.java public byte[] transform(final String name, final String transformedName, byte[] bytes) 書き換えの実態を担うクラス。引数は クラス名、易読化クラス名、バイトコードである。 バイトコードはそのままでは読めない読めたらすごいため、 ClassReader(バイトコードをASMで読めるようにする)→ClassWriter(ClassReaderを書き出せるようにする)→ClassVisitor(内部クラスでクラスを書き換えられるようにする) と手順を踏んで使えるようにする。 最終的にClassWriterをバイトコードに書き出して返す。 間違って別のクラス・メソッドを書き換えてしまってはいけないため、名称でのチェックが必要。 FMLDeobfuscatingRemapper public String mapMethodName(String owner, String name, String desc) クラス名、難読化されたメソッド名、引数記述Type(後述)の順で引数を与えて易読化メソッド名を返す…… はずなのだが、forge1.7.10だと何故かうまく動かない事がある。そのため、コメントの通り難読化されたソースコードと易読化されたものを比較し、難読化名も判定しておいたほうがいい。 ClassVisitor public MethodVisitor visitMethod(int access, String methodName, String desc, String signature, String[] exceptions) ここで、呼び出し元のメソッドをチェックする。今回は"onUpdateEntity"から呼ばれた"isBurning"に対して書き換えを施しているが、もし無差別にあるメソッドを書き換えるならif節は不要。 MethodVisitor public void visitMethodInsn(int opcode, String owner, String methodName, String desc, boolean itf) メソッド内での呼び出しされたメソッドを訪れる。 同様にintやstringなども訪れることが出来る(Methodvisitorのソース参照)。 ここで他のメソッドを呼び出してやることで、書き換えが実現できる。 ビルド・コンパイル coremodが正しく読み込まれているならば以下が出力されているはずである。テストプレイ時はまずこれをチェックしてみてほしい。 Found a command line coremod alcore.asm.ALCorePlugin また、このデータをjarファイルにコンパイルしたらMinecraftのディレクトリにあるmodsフォルダに入れてテストプレイをしたほうが良い。 難読化の都合上環境を変えるとうまく動かないためである。 不具合がある場合はロガーやSystem.out.printInを使って引数や変数の内容を出力させてみるのも手である。 コメント この項目に関する質問などをどうぞ。 名前
https://w.atwiki.jp/regulus/pages/27.html
Although my lover lives In a place that I can t live I kind of find I like a life This lonely It rips and pierces me In places I can t see I love the rip of nerves The rip that wakes me So I m dissatisfied I love to satisfy I love to feel as though there s more that I need So come on home So come on home So come on - home home You re where you want to be I m where I want to be Come on we re chasing Everything we ve ever wanted I Replace you easily Replace pathetically I flirt with every flighty thing That falls my way But how I needed you When I needed you Let s not forget We are so strong So bloody strong Come on home So come on home So come on - home, home Blue light falls Upon your perfect skin Falls and you draw back again Falls and this is how I fell And I cannot forget I cannot forget Come on home So come on home But don t forget to leave
https://w.atwiki.jp/akasatanahama/pages/105.html
概要 インベントリを持ち、アイテムを保持できるTileEntityを追加する。 GUIの実装はしていない。 ソースコード AluminiumMod.java package tutorial.aluminiummod; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Instance; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.Block; @Mod(modid = AluminiumMod.MODID, name = AluminiumMod.MODNAME, version = AluminiumMod.VERSION) public class AluminiumMod { public static final String MODID = "AluminiumMod"; public static final String MODNAME = "Aluminium Mod"; public static final String VERSION = "1.0.0"; public static Block chestAluminium; @EventHandler public void perInit(FMLPreInitializationEvent event) { chestAluminium = new BlockAluminiumChest() .setBlockName("chestAluminium") .setBlockTextureName("aluminiummod Aluminium_Chest"); GameRegistry.registerBlock(chestAluminium, "chestAluminium"); GameRegistry.registerTileEntity(TileEntityAluminiumChest.class, "TileEntityAluminiumChest"); } } BlockAluminiumChest.java package tutorial.aluminiummod; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class BlockAluminiumChest extends Block implements ITileEntityProvider { private Random random = new Random(); public BlockAluminiumChest() { super(Material.rock); this.setCreativeTab(CreativeTabs.tabDecorations); this.setHardness(5.0F); this.setResistance(1.0F); this.setStepSound(soundTypeMetal); isBlockContainer = true; } @Override public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityAluminiumChest(); } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { // TileEntityを取得し、プレイヤーが手にアイテムを持っていないなら取り出し、持っているなら入れる。 TileEntity tileEntity = world.getTileEntity(x, y, z); if (tileEntity == null || !(tileEntity instanceof TileEntityAluminiumChest)) return false; TileEntityAluminiumChest chest = (TileEntityAluminiumChest) tileEntity; if (player.getHeldItem() == null) { player.inventory.mainInventory[player.inventory.currentItem] = chest.tryExportItemStack(); } else { if (chest.tryImportItemStack(player.getHeldItem())) { player.inventory.mainInventory[player.inventory.currentItem] = null; } } return true; } @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { // TileEntityの内部にあるアイテムをドロップさせる。 TileEntityAluminiumChest tileentity = (TileEntityAluminiumChest) world.getTileEntity(x, y, z); if (tileentity != null) { for (int i = 0; i tileentity.getSizeInventory(); i++) { ItemStack itemStack = tileentity.getStackInSlot(i); if (itemStack != null) { float f = random.nextFloat() * 0.6F + 0.1F; float f1 = random.nextFloat() * 0.6F + 0.1F; float f2 = random.nextFloat() * 0.6F + 0.1F; while (itemStack.stackSize 0) { int j = random.nextInt(21) + 10; if (j itemStack.stackSize) { j = itemStack.stackSize; } itemStack.stackSize -= j; EntityItem entityItem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemStack.getItem(), j, itemStack.getItemDamage())); if (itemStack.hasTagCompound()) { entityItem.getEntityItem() .setTagCompound(((NBTTagCompound) itemStack.getTagCompound().copy())); } float f3 = 0.025F; entityItem.motionX = (float) random.nextGaussian() * f3; entityItem.motionY = (float) random.nextGaussian() * f3 + 0.1F; entityItem.motionZ = (float) random.nextGaussian() * f3; world.spawnEntityInWorld(entityItem); } } } world.func_147453_f(x, y, z, block); } super.breakBlock(world, x, y, z, block, meta); } } TileEntityAluminiumChest.java package tutorial.aluminiummod; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; public class TileEntityAluminiumChest extends TileEntity implements IInventory { protected ItemStack[] itemStacks = new ItemStack[54]; protected byte importingSlot; protected byte exportingSlot; public boolean tryImportItemStack(ItemStack itemStack) { for (int i = 0; i this.getSizeInventory(); i++) { importingSlot = this.getNextSlot(importingSlot); if (itemStacks[importingSlot] == null) { itemStacks[importingSlot] = itemStack.copy(); return true; } } return false; } public ItemStack tryExportItemStack() { for (int i = 0; i this.getSizeInventory(); i++) { exportingSlot = this.getNextSlot(exportingSlot); if (itemStacks[exportingSlot] != null) { ItemStack itemStack = itemStacks[exportingSlot].copy(); itemStacks[exportingSlot] = null; return itemStack; } } return null; } protected byte getNextSlot(byte slot) { slot++; if (slot = this.getSizeInventory()) slot = 0; return slot; } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i itemStacks.length; i++) { if (itemStacks[i] == null) continue; NBTTagCompound nbt1 = new NBTTagCompound(); nbt1.setByte("Slot", (byte) i); itemStacks[i].writeToNBT(nbt1); nbttaglist.appendTag(nbt1); } nbt.setTag("Items", nbttaglist); nbt.setByte("ImportingSlot", importingSlot); nbt.setByte("ExportingSlot", exportingSlot); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList nbttaglist = nbt.getTagList("Items", 10); itemStacks = new ItemStack[54]; for (int i = 0; i nbttaglist.tagCount(); i++) { NBTTagCompound nbt1 = nbttaglist.getCompoundTagAt(i); byte b0 = nbt1.getByte("Slot"); if (0 = b0 b0 itemStacks.length) { itemStacks[b0] = ItemStack.loadItemStackFromNBT(nbt1); } } importingSlot = nbt.getByte("ImportingSlot"); exportingSlot = nbt.getByte("ExportingSlot"); } @Override public int getSizeInventory() { return 54; } @Override public ItemStack getStackInSlot(int slot) { return itemStacks[slot]; } @Override public ItemStack decrStackSize(int slot, int amount) { if (itemStacks[slot] == null) return null; ItemStack itemstack; if (itemStacks[slot].stackSize = amount) { itemstack = itemStacks[slot]; itemStacks[slot] = null; return itemstack; } itemstack = itemStacks[slot].splitStack(amount); if (itemStacks[slot].stackSize 1) { itemStacks[slot] = null; } return itemstack; } @Override public ItemStack getStackInSlotOnClosing(int slot) { return null; } @Override public void setInventorySlotContents(int slot, ItemStack itemStack) { itemStacks[slot] = itemStack; if (itemStack != null itemStack.stackSize this.getInventoryStackLimit()) { itemStack.stackSize = this.getInventoryStackLimit(); } } @Override public boolean hasCustomInventoryName() { return false; } @Override public String getInventoryName() { return "container.AluminiumMod.AluminiumChest"; } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer player) { return worldObj.getTileEntity(xCoord, yCoord, zCoord) != this ? false player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) = 64.0D; } @Override public void openInventory() {} @Override public void closeInventory() {} @Override public boolean isItemValidForSlot(int slot, ItemStack itemStack) { return true; } } 解説 GameRegistry void registerTileEntity(Class ? extends TileEntity tileEntityClass, String id) TileEntityをマップに追加する処理。 これをやらないとreadFromNBTが呼ばれず、エラーが出る。 Block boolean isBlockContainer TileEntityを持つブロックかどうか。 使われてないようだが一応設定しておく。 boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) ブロックが右クリックされた時の処理。 void breakBlock(World world, int x, int y, int z, Block block, int meta) ブロックが破壊された時の処理。 ITileEntityProvider TileEntityを持つブロックのためのインターフェース。 TileEntity createNewTileEntity(World world, int meta) TileEntityのインスタンスを生成し返す。 TileEntity void writeToNBT(NBTTagCompound nbt) 引数のNBTにTileEntityのデータを書き込む処理。 void readFromNBT(NBTTagCompound nbt) 引数のNBTからTileEntityのデータを読み込む処理。 IInventory インベントリを持つTileEntityのためのインターフェース。 int getSizeInventory() インベントリのスロット数を返す。 ItemStack getStackInSlot(int slot) 引数のスロットに入っているItemStackを返す。 ItemStack decrStackSize(int slot, int amount) 第一引数のスロットに入ってるItemStackのスタック数を第二引数の量減らす。 ItemStack getStackInSlotOnClosing(int slot) GUIが閉じられた時に、引数のスロットの中身を返し、消す処理。 エンチャントテーブルなど、GUIを閉じたときにドロップするものが使う。 void setInventorySlotContents(int slot, ItemStack itemStack) 引数のスロットの中身を設定する。 boolean hasCustomInventoryName() 名札でつけられた名前を持つかどうか。 String getInventoryName() デフォルトの名前を返す。 int getInventoryStackLimit() インベントリのスタック数の最大値を返す。 boolean isUseableByPlayer(EntityPlayer player) 引数のプレイヤーがGUIを開けるかどうか。 void openInventory() GUIを開いたときの処理。 void closeInventory() GUIを閉じたときの処理。 boolean isItemValidForSlot(int slot, ItemStack itemStack) ホッパーなどが引数のスロットにアクセスできるかを返す。 使用例 プレゼントボックスを追加している部分。 +オファレンMOD OfalenModCore.java package nahama.ofalenmod; /*略*/ /** * @author Akasata Nahama */ @Mod(modid = OfalenModCore.MODID, name = OfalenModCore.MODNAME, version = OfalenModCore.VERSION) public class OfalenModCore { public static final String MODID = "OfalenMod"; public static final String MODNAME = "Ofalen Mod"; public static final String MCVERSION = "1.7.10"; public static final String OMVERSION = "1.1.0"; public static final String VERSION = "[" + MCVERSION + "]" + OMVERSION; /*略*/ /** 初期化前処理。 */ @EventHandler public void preInit(FMLPreInitializationEvent event) { /*略*/ OfalenModBlockCore.registerBlock(); /*略*/ } /*略*/ } OfalenModBlockCore.java package nahama.ofalenmod.core; /*略*/ public class OfalenModBlockCore { /*略*/ public static Block boxPresentOfalen; /** ブロックを登録する処理。 */ public static void registerBlock() { /*略*/ boxPresentOfalen = new BlockPresentBox() .setBlockName("boxPresentOfalen") .setBlockTextureName("ofalenmod present_box"); GameRegistry.registerBlock(boxPresentOfalen, "boxPresentOfalen"); GameRegistry.registerTileEntity(TileEntityPresentBox.class, "TileEntityOfalenPresentBox"); } } BlockPresentBox.java package nahama.ofalenmod.block; /*略*/ public class BlockPresentBox extends Block implements ITileEntityProvider { private Random random = new Random(); /** 0 下,1 上,2 横,3 クリスマス下,4;クリスマス上,5 クリスマス横 */ private IIcon[] iicon = new IIcon[6]; public BlockPresentBox() { super(Material.sponge); this.setCreativeTab(OfalenModCore.tabOfalen); this.setHardness(1.0F); this.setResistance(1.0F); this.setStepSound(Block.soundTypeCloth); } @Override public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityPresentBox(); } /*略*/ /** ブロックが破壊された時の処理。 */ @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { // TileEntityの内部にあるアイテムをドロップさせる。 TileEntityPresentBox tileentity = (TileEntityPresentBox) world.getTileEntity(x, y, z); if (tileentity != null) { for (int i = 0; i tileentity.getSizeInventory(); i++) { ItemStack itemStack = tileentity.getStackInSlot(i); if (itemStack != null) { float f = random.nextFloat() * 0.6F + 0.1F; float f1 = random.nextFloat() * 0.6F + 0.1F; float f2 = random.nextFloat() * 0.6F + 0.1F; while (itemStack.stackSize 0) { int j = random.nextInt(21) + 10; if (j itemStack.stackSize) { j = itemStack.stackSize; } itemStack.stackSize -= j; EntityItem entityItem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemStack.getItem(), j, itemStack.getItemDamage())); if (itemStack.hasTagCompound()) { entityItem.getEntityItem().setTagCompound(((NBTTagCompound) itemStack.getTagCompound().copy())); } float f3 = 0.025F; entityItem.motionX = (float) random.nextGaussian() * f3; entityItem.motionY = (float) random.nextGaussian() * f3 + 0.1F; entityItem.motionZ = (float) random.nextGaussian() * f3; world.spawnEntityInWorld(entityItem); } } } world.func_147453_f(x, y, z, block); } super.breakBlock(world, x, y, z, block, meta); } /** ブロックのアイコンを登録する処理。 */ @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister register) { for (int i = 0; i 6; i++) { iicon[i] = register.registerIcon(this.getTextureName() + "-" + i); } } /** ブロックのアイコンを返す。 */ @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { int i = 2; if (side == 0) i = 0; if (side == 1) i = 1; if (OfalenModAnniversaryHandler.isChristmas) i += 3; return iicon[i]; } } TileEntityPresentBox.java package nahama.ofalenmod.tileentity; import nahama.ofalenmod.handler.OfalenModAnniversaryHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; public class TileEntityPresentBox extends TileEntity implements IInventory { protected ItemStack[] itemStacks = new ItemStack[54]; protected String owner; /*略*/ @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i itemStacks.length; i++) { if (itemStacks[i] == null) continue; NBTTagCompound nbt1 = new NBTTagCompound(); nbt1.setByte("Slot", (byte) i); itemStacks[i].writeToNBT(nbt1); nbttaglist.appendTag(nbt1); } nbt.setTag("Items", nbttaglist); nbt.setString("Owner", owner); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList nbttaglist = nbt.getTagList("Items", 10); itemStacks = new ItemStack[54]; for (int i = 0; i nbttaglist.tagCount(); i++) { NBTTagCompound nbt1 = nbttaglist.getCompoundTagAt(i); byte b0 = nbt1.getByte("Slot"); if (0 = b0 b0 itemStacks.length) { itemStacks[b0] = ItemStack.loadItemStackFromNBT(nbt1); } } owner = nbt.getString("Owner"); } /** インベントリのスロット数を返す。 */ @Override public int getSizeInventory() { return 54; } /** スロットのアイテムを返す。 */ @Override public ItemStack getStackInSlot(int slot) { return itemStacks[slot]; } /** スロットのスタック数を減らす。 */ @Override public ItemStack decrStackSize(int slot, int amount) { if (itemStacks[slot] == null) return null; ItemStack itemstack; if (itemStacks[slot].stackSize = amount) { itemstack = itemStacks[slot]; itemStacks[slot] = null; return itemstack; } itemstack = itemStacks[slot].splitStack(amount); if (itemStacks[slot].stackSize 1) { itemStacks[slot] = null; } return itemstack; } @Override public ItemStack getStackInSlotOnClosing(int slot) { return null; } /** スロットの中身を設定する。 */ @Override public void setInventorySlotContents(int slot, ItemStack itemStack) { itemStacks[slot] = itemStack; if (itemStack != null itemStack.stackSize this.getInventoryStackLimit()) { itemStack.stackSize = this.getInventoryStackLimit(); } } /** 金床で設定された名前を持つかどうか。 */ @Override public boolean hasCustomInventoryName() { return false; } /** インベントリの名前を返す。 */ @Override public String getInventoryName() { return "container.OfalenMod.PresentBox"; } /** このインベントリの最大スタック数を返す。 */ @Override public int getInventoryStackLimit() { return 64; } /** プレイヤーが使用できるかどうか。 */ @Override public boolean isUseableByPlayer(EntityPlayer player) { if (owner != null !player.getCommandSenderName().equals(owner)) return false; return worldObj.getTileEntity(xCoord, yCoord, zCoord) != this ? false player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) = 64.0D; } @Override public void openInventory() {} @Override public void closeInventory() {} /** スロットにアクセスできるかどうか。 */ @Override public boolean isItemValidForSlot(int slot, ItemStack itemStack) { return false; } } コメント この項目に関する質問などをどうぞ。 名前
https://w.atwiki.jp/smartphonecom/pages/5.html
docomo ARROWS NX F-01F サイズ 高さ 約 140mm×幅 約 70mm×厚さ 約 10mm 電池パック装着時の重さ 約 150g 連続待受時間 (静止時) 3G:約 850時間/LTE:約 670時間/GSM:約 670時間 連続通話時間 (音声通話時) 3G:約 780分/GSM:約 780分 実使用時間 約 97.1時間 充電時間 約 190分 急速充電 バッテリー容量 3200mAh ディスプレイ(メイン/サブ) 種類 フルHD TFT(WhiteMagicTM)/ サイズ 約 5.0インチ/ 最大同時発色数 16,777,216色/ 解像度(ピクセル数) 1080×1920ピクセル/ 電話帳 名前最大登録件数 (名前1件につき登録できる電話番号/メールアドレス) 約 23.0GB(共有)(件数制限なし) 電話番号最大登録件数 約 23.0GB(共有)(件数制限なし) メールアドレス最大登録件数 約 23.0GB(共有)(件数制限なし) メール最大保存件数 (受信/送信) 受信約 23.0GB(共有)/送信約 23.0GB(共有) Xi(クロッシィ) 受信/送信 (受信150Mbps/送信50Mbps) クアッドバンドLTE 対応周波数 2GHz 1.7GHz 1.5GHz 800MHz FOMAハイスピード (受信/送信) (受信14Mbps/送信5.7Mbps) OS AndroidTM 4.2 内蔵メモリ ROM 32GB RAM 2GB データフォルダ容量 約 23.0GB プロセッサ Qualcomm MSM8974 2.2GHz(クアッドコア) miniUIMカード専用
https://w.atwiki.jp/sims222/pages/12.html
MOD TOOLS Sims2のプレイを便利にしてくれるTOOLを紹介しています。 The Compressorizer! Downloadsフォルダのpackageファイルを圧縮してくれるソフト。 どういう仕組みなのかわかりませんがとにかく圧縮してくれます。 インストール Microsoft Windows and the .NET Framework Version 1.1をインストールしていないと動作しません。 公式ホームページのDJS Sims!(http //www.djssims.com/ )に飛んで、 左メニューから Sims 2 Hacks and Such → Programsを開きます。 そのページにThe Compressorizer!が紹介されています。 インストールするタイプ、解凍するだけで使えるタイプの二種類がありますので 使いやすい方を選んでダウンロード、インストールを行ってください。 使い方 TheCompressorizer.exeを起動して[Add File to List]をクリックします。 圧縮したいPackageが入ったフォルダを指定します。(サブフォルダは含まれません。) 画面左上の[List of File to Compress]にそのフォルダに入っているPackageファイルのリストが出てきます。 画面下の[GO!]をクリックすれば圧縮が開始されます。 圧縮が完了すると[Operation Complete!]と表示されます。 [Remove Selected File From List]をクリックすれば圧縮するリストをキャンセルできます。 [Clear File List]をクリックすれば圧縮が完了したリストを消去できます。 The Sims2 Package Editor (SimPE) シムの性格や願望、肌やDNAの情報を弄ったりオブジェクトを編集したりさまざまなことが出来るソフト。 (結構長い間使ってますがいまだに使い慣れてません。) 使い方は別のページで紹介したいと思います。 インストール Microsoft .NET Framework Version 2.0、メッシュを弄る場合はDirect X 9cがないと動作しません。 公式ホームページ (http //sims.ambertation.de/ )に飛びます。 ページ上部のメニューより[Downloads]をクリックします。 注意書きが表示されるのでエキサイト翻訳などで訳しながら同意するのであればI Agreeをクリック Main SimPE Downloadのsetupファイルをダウンロードします。 セットアップウィザードにしたがってインストールを行ってください。
https://w.atwiki.jp/cod4mod/pages/54.html
※
https://w.atwiki.jp/google-android/pages/14.html
Biz・ホーダイ ダブル i-modeからの移行
https://w.atwiki.jp/soreiro/pages/147.html
Weekly Turn-In 12/6~13 マヌク -- 名もなき島 --- 70-95 Comodo Dungeon Monster VIP EXP/JEXP non-VIP EXP/JEXP Pest 804,600 905,400 536,400 603,600 Medusa 1,042,200 781,200 694,800 520,800 105-120 Manuk Field 3 Monster VIP EXP/JEXP non-VIP EXP/JEXP Hillsrion 1,745,400 1,018,800 1,163,600 679,200 Tatacho 2,257,200 1,855,200 1,504,800 1,236,800 125-140 Cursed Monastery 3 Monster VIP EXP/JEXP non-VIP EXP/JEXP Banshee 2,712,000 2,100,000 1,808,000 1,400,000 Necromancer 3,348,000 2,511,000 2,232,000 1,674,000 ※ EXP/JEXP は、iRO Wiki による 名称は、iW Database に準拠したHillslionForums HillslioniRO Wiki Hillthrion RODE-R HillsrioniW Database ◆ Monster List Monster Lv HP Base Job Race Attribute Hit Flee Pest 89 5,747 1,341 1,509 Animal Shadow 2 366 352 Medusa 102 10,045 1,737 1,302 Demon Neutral 2 370 346 Hillsrion 123 21,422 2,909 1,698 Animal Earth 1 392 400 Tatacho 128 33,336 3,762 3,092 Animal Earth 1 361 381 Banshee 130 48,666 4,520 3,500 Demon Shadow 2 401 403 Necromancer 133 91,304 5,580 4,185 Undead Undead 4 387 399
https://w.atwiki.jp/battlefield1942/pages/551.html
マップのロード中に強制終了するんだが -- 名無し (2008-01-04 01 23 08) ↑FHは入ってるか? -- 名無しさん (2008-01-04 10 34 07) 作者様、zip版ありがとう。 -- 名無しさん (2008-01-20 16 56 56) quintrix -- 私のも強制終了してしまいます。cドライブ以外に入れたらなりました。vistaだからなのでしょうか? (2008-01-21 01 29 25) そう -- 名無しさん (2008-04-09 22 55 11) やりてぇえええええええええええええええええええええ -- 名無しさん (2009-02-06 11 28 30) 鯖がない・・・・・ -- 名無しさん (2009-02-09 13 50 43) みんなでマルチに行こう -- 名無しさん (2009-02-09 17 44 25) 鯖あるんですか? -- 名無しさん (2009-02-22 16 45 23) ない -- 名無しさん (2009-02-22 17 11 14) HLSWで見ると今サーバーたってますよー -- TornadoX (2009-03-24 18 57 49) ロード中の曲が、燃える -- 名無しさん (2009-04-25 22 19 31) 防衛隊MOD+戦国時代MOD=戦国自衛隊MOD 絶対面白そう -- 名無しさん (2009-05-09 10 55 09) やってみれば? -- 名無しさん (2009-05-09 14 37 15) ニ版が出ているので修正お願いします。 -- 名無しさん (2009-05-10 12 55 59) これでいいのかな? -- 名無しさん (2009-05-10 21 26 35) マップのロード中に強制終了する・・・・・ダダダ -- 名無しさん (2009-05-12 01 05 53) 修正ファイルを当てないとハ版は落ちます -- 名無しさん (2009-05-12 01 59 34) この修正ファイルハ版じゃなくてニ版に当ててニa版にする奴だよ -- 名無しさん (2009-05-12 16 27 54) ショッカーかわいいw -- 名無しさん (2009-05-20 22 53 33) ニ版で追加されてる、「人民軍」、「アダムスキー型」、「変種第2号」の登場するマップを教えていただけませんでしょうか。 -- TornadoX (2009-05-21 18 42 49) アダムスキー型はおなえかなぁ -- 名無しさん (2009-05-21 19 01 29) 前のバージョン出来たのにシングル全然出来なくなった。VISTA -- 名無しさん (2009-05-31 17 20 13) 軍隊は「国道448号線」、後は「ONAE」 -- 名無しさん (2009-05-31 18 27 12) この表紙には感動した -- 名無しさん (2009-09-15 23 38 41) UFOの種類を多くすれば面白いと思う。 -- 名なしさん (2009-09-17 23 17 44) にほんへいのかおなぐりてえ -- 名無しさん (2009-11-21 23 10 13) なぜか落とせない…陥落したのか? -- 名無しさん (2009-11-26 05 10 32) otoseruyo -- 名無しさん (2009-11-26 20 07 34) ↑有難う御座います -- 名無しさん (2009-11-29 07 18 51) シーチキンはどのあたりで出るんだ? -- 名無しさん (2009-12-09 20 06 22) ニコニコ動画に防衛隊のシーチキンうpしてくださればありがたい -- 名無し (2010-03-20 17 35 55) 最新バージョンはハ版じゃなかったっけ? -- 名無しさん (2010-05-05 11 43 46) ↑間違えたホ版だった -- 名無しさん (2010-05-05 11 45 28) ほんとだwやっとシーチキンにクジラを御馳走してやれるんだなw -- 名無しさん (2010-05-05 13 38 20) おい、こいつら牛を屋根裏に隠してるぞ! -- 名無しさん (2010-05-08 10 10 38) 新バージョン落ちるぜby vista -- 名無しさん (2010-05-08 17 29 16) 98/me互換モードでやってみ -- 名無しさん (2010-05-08 17 54 00) 98/me互換モードどうやるのですか? -- 名無しさん (2010-07-30 19 13 40) 何でもかんでも人に聞いてちゃ駄目だ。グーグルなりで検索すればやり方書いてあるページなんてごまんと出てくるぞ。 -- 名無しさん (2010-07-30 22 54 31) どのアイコンを互換モードするのか解りませんでした・・・(´・ω ;. ... -- 名無しさん (2010-07-31 07 24 13) BF1942.exeを互換モードにするんだ、ただし梅鯖に入るときは元に戻さないと蹴られるぞ -- 名無しさん (2010-09-06 13 38 56) え?なんで蹴られるの? FHSWまだ入れてない、↑↑の人では無い人 -- 名無しさん (2010-09-06 23 26 36) 互換モードでやるとPunkBusterが働かないのでPB使ってる鯖では蹴られてしまう。 -- 名無しさん (2010-09-07 07 20 12) サーバーいつ立ってんですか!?立った場合どこで確認できます!? -- 名無しさん (2010-09-25 22 29 01) 背景の動画映画の宣戦布告でしょ?あれ一番自衛隊がかっこいいと思った映画だったそれより鯖だれもいないんだが -- 名無しさん (2011-02-13 15 38 32) BGMはウルトラマン? -- 名無しさん (2011-04-21 19 17 44) 怪獣大戦争マーチっぽい -- 名無しさん (2011-04-21 22 00 18) youtubeのリンクが切れてましたね。修正しておきました。 -- 名無しさん (2011-04-22 15 06 10) ウルトラマンではなくゴジラです。自衛隊 -- 名無しさん (2011-04-22 21 05 16) ロードで使われてるのはアレンジなのかな?原曲と比べてテンポが早い -- 名無しさん (2011-04-22 21 38 09) へ版キター! -- 名無しさん (2011-05-06 12 19 57) ヘ版じゃないぞ、ト版だぞ次は -- 名無しさん (2011-05-06 16 11 28) シングル -- 名無しさん (2011-06-24 22 26 01) ↑ミス シングルだとオマハがロード終わった瞬間ゲームが終了する -- 名無しさん (2011-06-24 22 27 18) 科特隊のテーマだ!これ聞きたかったんだ!ありがとう! -- 名無しさん (2011-10-29 13 10 04) 誰かマルチやりません? -- 名無しさん (2011-11-21 16 30 54) マルチはいつやっているの? -- 名無しさん (2011-12-02 23 58 32) ごく稀に祭りとして鯖が立てられることがある。スレをチェックしておくのがいいかも。 -- 名無しさん (2011-12-03 09 31 05) FHDF"T"ってなんぞ・・・いま秋鯖立ってるんだがorz -- 名無しさん (2012-01-29 20 14 24) 開発陣によるテスト鯖だったような。テスト版のを回してるからまず入れないと思うよ -- 名無しさん (2012-01-30 17 48 01) メニュー画面が科学特捜隊の出撃BGMだ -- 名無しさん (2012-02-03 22 55 39) カランタンでゆっくりできないw -- 名無しさん (2012-05-16 22 52 26) 鯖がない -- 名無しさん (2012-05-21 22 10 37) 雰囲気的にプロテクトギア出してもよくね?みたいな気がした -- 名無しさん (2012-08-01 18 16 48) 初期ヴァージョンに楯の会があったなぁ。ハーフトラックが街宣車風になっていて。無くしたのかな? -- 名無しさん (2012-09-02 16 21 14) 1.162に導入したけどマップが3つしかない上にロードしたら半分ぐらいで落ちる・・・・ -- 名無しさん (2012-12-09 16 17 28) なぜか落ちる -- 名無しさん (2012-12-24 22 05 23) ダウンロードしたあとにどうやって入れればいいのですか?OSはWIN7です -- 名無しさん (2013-01-01 18 14 58) MODのファイルにFHDFのファイルを入れるだけ。因みにこのwikiのあちこちにMOD導入について書かれてるよ。FHは入れた? -- 名無しさん (2013-01-01 19 38 47) はい、入れました。7ZIPで開いて入れるんですね。ありがとうございますm(_ _)m -- 名無しさん (2013-01-01 22 11 48) これの祭りって近々ないかしらねぇ -- 名無しさん (2013-01-25 22 00 59) 偶に鯖立ってる 新ver出たときは祭りある -- 名無しさん (2013-01-26 13 03 35) あ、そうなんですか。よく目を凝らして見てみようと思います。上コメさんありがとう。 -- 名無しさん (2013-01-28 19 59 48) マップが3個しか出ないのはなぜ? -- 名無しさん (2013-04-23 23 37 32) 公式サイトは消えてるしGoogleDriveにもヘ版しか置いてないし今は実質DL不可能だな -- 名無しさん (2013-07-07 16 13 45) ↑アップロードしといたぞ -- 名無しさん (2013-07-08 15 15 52) ↑hei!塩!よくやったー! -- bf (2013-07-08 21 59 15) 作者様サイトからもDLが再度可能となりました -- 名無しさん (2013-07-09 19 08 35) ↑hei!塩!よくやったー!hei!塩!よくやったー! -- bf (2013-07-09 20 59 59) ありがてぇ・・・ありがてぇ・・・ -- 名無しさん (2013-07-12 23 35 38) win8で98/Me互換で起動したらできたぞ -- 名無しさん (2013-08-27 21 48 18) win7で98/Me互換でプレイできるけどサウンドがおかしいんだがBGM -- 名無しさん (2013-10-27 11 21 45) 上の続き。BGMがとぎれとぎれになったりする。Origin版。 -- 名無しさん (2013-10-27 11 24 46) Originだからね、しょうがないね -- 名無しさん (2013-10-27 12 58 40) 更新しました -- 名無しさん (2013-12-31 13 11 22) MAPが3つしかないのですが、クリアすると増えますか? -- 名無しさん (2014-05-23 00 28 45) coop無理なのか -- 名無しさん (2014-06-26 21 49 47) 随分前のverは出来てましたね、何版だったっか忘れましたが... -- 名無しさん (2014-07-20 22 17 14) FHDFのウィキ削除されてる・・・ -- 名無しさん (2014-10-18 22 28 59) 鯖に入ると落ちちゃう 助けてくださいな -- 名無しさん (2015-05-03 22 27 27) リンク切れにつき、ダウソ不可なり。 -- (名無しさん) 2016-02-14 18 36 53 coopできない おもしろいのにもったいないなあ -- (名無しさん) 2021-02-23 23 42 46 日本語化のリンク変わってる https //bf.hokkaidojpn.com/cgi-bin/pukupuku/pukupuku.cgi?mode=dl amp;id=55b3aec8000_1e29 amp;ps=25999 -- (名無しさん) 2021-05-23 14 49 22 「防衛隊MOD リa版 完全日本語化パッチv1.0」のInternet Archiveにあるアーカイブのリンク貼っとくhttps //web.archive.org/web/20210616002749/https //bf.hokkaidojpn.com/cgi-bin/pukupuku/pukupuku.cgi?mode=dl amp;id=55b3aec8000_1e29 amp;ps=25999 -- (名無しさん) 2023-03-01 00 48 20
https://w.atwiki.jp/mod-jplang/pages/33.html
支援系mod見出し ここは支援系modの見出し&リンク場所です リンク Multi Page Chest Not Enough Items Waila